
package test.src.awt_swing;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Timer;

import java.util.TimerTask;


import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JLabel;

import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

import java.awt.Color;

import java.awt.Dimension;

import java.awt.FlowLayout;

import java.awt.Font;


import java.awt.event.ActionEvent;

import java.awt.event.ActionListener;

import java.util.Timer;

import java.util.TimerTask;


import javax.swing.BoxLayout;

import javax.swing.JButton;

import javax.swing.JComponent;

import javax.swing.JFrame;

import javax.swing.JLabel;


import javax.swing.JOptionPane;

import javax.swing.JPanel;

import javax.swing.JTextField;

import javax.swing.SwingConstants;
//import导入关键字，java.awt用于写界面的包，Dimension封装了一个构件的高度和宽度


@SuppressWarnings("unused")
//用于抑制编译器产生“未使用变量”的警告信息
public class Time extends JFrame
//把Time类定义为JFrame类的子类，JFrame可创建最底层容器
{

    private static final long serialVersionUID = 1L;
    //定义程序序列化ID（用于程序的版本控制，保持不同版本兼容性）
    private static final String[] NS =

            {"会议发言计时器",
                    "时", "分", "秒",
                    "计时总分钟数:",
                    "你已用:", "时", "分", "秒", "发言剩余时间:",
                    "开始倒计时", "暂停计时", "停止计时"};

    private static int index = 0;
//静态方法


    private long ms = 0;
//定义长整型变量


    private boolean isPaused = false;
//定义私有boolean类型的isPaused，赋值为false


    private Timer timer;
//定时器


    public Time(String title)
//创建一个新计时器，其相关的线程具有指定的名称
    {

        setTitle(title);


    }
//设置窗体的标题


    private Time addComponents()
//添加组件
    {

        final JTextField[] ts = new JTextField[7];
//定义了新的局部变量
        for (int i = 0; i < 4; i++) {

            ts[i] = new JTextField();

            ts[i].setPreferredSize(new Dimension(50, 50));
//调整组件大小宽和高
            ts[i].setFont(new Font("宋体", Font.BOLD, 30));
//设置字体显示效果，bold加粗
            ts[i].setHorizontalAlignment(SwingConstants.CENTER);
//设置文本居中对齐
            ts[i].setOpaque(true);
//设置控件不透明
            ts[i].setBackground(Color.black);
//设置背景为黑色
            ts[i].setForeground(Color.pink);
//设置前景色为粉色
            if (i != 3) {

                ts[i].setEditable(false);
//设置不可编辑
            }

        }

        for (int i = 4; i < 7; i++) {

            ts[i] = new JTextField();

            ts[i].setPreferredSize(new Dimension(40, 60));

            ts[i].setFont(new Font("宋体", Font.BOLD, 30));

            ts[i].setHorizontalAlignment(SwingConstants.CENTER);

            ts[i].setOpaque(true);

            ts[i].setBackground(Color.BLUE);

            ts[i].setForeground(Color.RED);

            if (i != 3) {

                ts[i].setEditable(false);

            }

        }

        JLabel[] ls = new JLabel[10];
//创建无图像并且标题为空字符串的JLabel数组
        for (int i = 0; i < 10; i++) {

            ls[i] = new JLabel(NS[index++]);

            ls[i].setForeground(Color.black);

            ls[i].setFont(new Font("宋体", Font.BOLD, 30));


        }

        final JButton[] bs = new JButton[3];
//创建具有平台独立实现的带标签的按钮
        for (int i = 0; i < 3; i++) {

            bs[i] = new JButton(NS[index++]);


            bs[i].setBackground(Color.black);

            bs[i].setForeground(Color.pink);

        }

        bs[0].addActionListener(new ActionListener()
//为上面的按钮添加侦听器
                                {

                                    @Override
//是伪代码，表示重写
                                    public void actionPerformed(ActionEvent e)
//接收操作事件的侦听器接口
                                    {
//编写一个ActionListener类的侦听器，组件注册该侦听器，
//侦听器内部要编写这个actionPerformed方法
                                        try {

                                            if (!isPaused) {

                                                long min = Long.parseLong(ts[3].getText());

                                                long h = min / 60;

                                                h = h < 0 ? 0 : h;

                                                long m = min - h * 60 - 1;

                                                m = m < 0 ? 0 : m;

                                                long s = min == 0 ? 0 : 60;

                                                //转换输入分钟格式

                                                ts[0].setText(h + "");

                                                ts[0].setBackground(Color.BLUE);

                                                ts[0].setForeground(Color.yellow);


                                                ts[1].setText(m + "");

                                                ts[1].setBackground(Color.BLUE);

                                                ts[1].setForeground(Color.YELLOW);


                                                ts[2].setText(s + "");

                                                ts[2].setBackground(Color.BLUE);

                                                ts[2].setForeground(Color.YELLOW);


                                            }

                                            timer = new Timer();

                                            timer.schedule(new TimerTask()
//安排执行指定的计时任务
                                            {

                                                @Override

                                                public void run() {

                                                    long h = Long.parseLong(ts[0].getText());

                                                    //把小时的字符串转换成数字

                                                    long m = Long.parseLong(ts[1].getText());


                                                    long s = Long.parseLong(ts[2].getText());

                                                    s--;

                                                    ms++;


                                                    if ((h != 0 || m != 0) && s == 0) {

                                                        m--;

                                                        s = 59;

                                                    }

                                                    if (h != 0 && m == 0) {

                                                        h--;

                                                        m = 59;

                                                    }

                                                    h = h < 0 ? 0 : h;

                                                    m = m < 0 ? 0 : m;

                                                    s = s < 0 ? 0 : s;


                                                    ts[0].setText(h + "");

                                                    ts[1].setText(m + "");

                                                    ts[2].setText(s + "");


                                                    long ph = ms / 60 / 60;

                                                    long pm = ms / 60;

                                                    long ps = ms % 60;


                                                    ts[4].setText(ph + "");

                                                    ts[5].setText(pm + "");

                                                    ts[6].setText(ps + "");


//时、分、秒之间的转换
                                                    if (h == 0 && m == 0 && s == 0) {

                                                        bs[2].doClick();

                                                    }

                                                }

                                            }, 0, 1000);


                                            bs[0].setEnabled(false);
//设置成false时，无法响应任何触发事件
                                        } catch (NumberFormatException nfe)
//处理数字格式化异常
                                        {

                                            JOptionPane.showConfirmDialog(Time.this,
//showConfirmDialog显示对话框
                                                    "输入错误，请重新输入分钟的整数。",


                                                    "友情提示",


                                                    JOptionPane.PLAIN_MESSAGE,

                                                    //Java消息提示框JOptionPane的使用方法

                                                    JOptionPane.WARNING_MESSAGE);


                                        }

                                    }

                                }

        );

        bs[1].addActionListener(new ActionListener() {

                                    @Override

                                    public void actionPerformed(ActionEvent e) {

                                        if (null != timer) {

                                            timer.cancel();
//把当前任务队列里的所有任务都取消
                                            timer = null;

                                        }

                                        bs[0].setEnabled(true);
//被启用
                                        isPaused = true;

                                    }

                                }

        );


        bs[2].addActionListener(new ActionListener() {


                                    @Override

                                    public void actionPerformed(ActionEvent e) {

                                        if (null != timer) {

                                            timer.cancel();

                                            timer = null;

                                        }


                                        bs[0].setEnabled(true);

                                        isPaused = false;

                                        ms = 0;

                                    }

                                }

        );

        JComponent[][] cs = {{ls[0]},
//JComponent定义了一个二维数组
                {ls[4], ts[3]},


                {ls[9], ts[0], ls[1], ts[1], ls[2], ts[2], ls[3]},


                {ls[5], ts[4], ls[6], ts[5], ls[7], ts[6], ls[8]},


                {bs[0], bs[1], bs[2]}};


        JPanel[] ps = new JPanel[5];
//可以包含其他组件的容器
        JPanel wrap = new JPanel();

        wrap.setLayout(new BoxLayout(wrap, BoxLayout.Y_AXIS));
//设置用户界面上的屏幕组件的格式布局


        for (int i = 0; i < 5; i++) {

            ps[i] = new JPanel(new FlowLayout(FlowLayout.CENTER));
//组件居中对齐，布局换行


            for (int j = 0; j < cs[i].length; j++) {

                ps[i].add(cs[i][j]);

                ps[i].setBackground(Color.gray);


            }

            wrap.add(ps[i]);

        }


        add(wrap);

        return this;

    }


    private Time init()
//初始化
    {


        pack();

        setResizable(true);
//调整窗体大小，true为可自由改变大小


        setLocationRelativeTo(null);
//将窗口置于屏幕中央
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //设置用户在此窗体上发起 "close" 时默认执行的操作

        setVisible(true);
//防止加载窗体时，组件不显示
        return this;

    }


    public static void main(String[] args) {

        Time time = new Time(NS[index]);


        time.addComponents().init();

    }

}